package com.yeyks.search.service;

import com.yeyks.search.pojo.model.EsHotelInfo;
import com.yeyks.search.pojo.model.EsRoomCalendarInfo;
import com.yeyks.search.pojo.model.EsRoomInfo;
import com.yeyks.search.pojo.model.base.BasalSearchParam;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.reindex.BulkByScrollResponse;

import java.util.List;
import java.util.Map;

/**
 * @author shuai
 * @date 2019/09/27 11:30
 */

public interface ElasticSearchService {

    /**
     * 创建索引
     *
     * @param indexName 索引名称
     */
    IndexResponse createIndex(String indexName);

    /**
     * 创建文档
     *
     * @param map       文档集合（必须包含id）
     * @param indexName 索引名称
     */
    IndexResponse createDocument(Map<String, Object> map, String indexName, String idColumnName);


    /**
     * 创建文档
     *
     * @param json      文档集合（必须包含id）
     * @param indexName 索引名称
     */
    IndexResponse createDocument(String json, String indexName, String id);

    /**
     * 批量创建酒店文档数据
     *
     * @param esHotelInfoList 酒店集合
     * @param indexName       索引名称
     * @return 返回结果
     */
    BulkResponse createMoreDocument(List<EsHotelInfo> esHotelInfoList, String indexName);


    /**
     * 创建文档
     *
     * @param json      文档集合（必须包含id）
     * @param indexName 索引名称
     * @param id        主键Id
     * @return
     */
    IndexResponse createHotelDocument(String json, String indexName, String id);

    /**
     * 批量创建酒店文档数据
     *
     * @param esHotelInfoList 酒店集合
     * @param indexName       索引名称
     * @return 返回结果
     */
    BulkResponse createMoreHotelDocument(List<EsHotelInfo> esHotelInfoList, String indexName);

    /**
     * 批量创建房间文档数据
     *
     * @param roomInfoList 房间集合
     * @param indexName    索引名称
     * @return 返回结果
     */
    BulkResponse createMoreRoomDocument(List<EsRoomInfo> roomInfoList, String indexName);

    /**
     * 批量创建房态文档数据
     *
     * @param roomCalendarInfoList 房间集合
     * @param indexName            索引名称
     * @return 返回结果
     */
    BulkResponse createMoreRoomCalendarDocument(List<EsRoomCalendarInfo> roomCalendarInfoList, String indexName);

    /**
     * 批量更新房态文档数据
     *
     * @param roomCalendarInfoList 房间集合
     * @param indexName 索引名称
     * @return 返回结果
     */
    BulkResponse updateMoreRoomCalendar(List<EsRoomCalendarInfo> roomCalendarInfoList, String indexName);

    /**
     * 更新文档
     *
     * @param map       文档集合（必须包含id）
     * @param indexName 索引名称
     */
    UpdateResponse updateDocument(Map<String, Object> map, String indexName, String idColumnName);

    /**
     * 删除文档
     *
     * @param indexName 索引名称
     * @param id        文档id
     */
    DeleteResponse deleteDocument(String indexName, String id);

    /**
     * 底层基础搜索
     *
     * @param queryBuilder 查询条件
     * @param param        公共条件
     * @param indexs       索引名称
     */
    SearchResponse search(QueryBuilder queryBuilder, BasalSearchParam param, String... indexs);

    /**
     * 根据条件查询房态列表信息（默认CN）
     *
     * @param sourceType 资源类型
     * @param calendarId 房态ID
     * @param pageSize 页大小
     * @param pageNo 当前页
     * @return
     */
    List<EsRoomCalendarInfo> c2bSearchCalendar(String indexName, String sourceType, String calendarId,
                                               Integer pageSize,
                                               Integer pageNo);

    /**
     * 根据条件查询房间信息
     * @param sourceType 资源类型
     * @param roomId 房间Id
     * @param pageSize 页大小
     * @param pageNo 当前页
     * @return 返回结果
     */
    List<EsRoomInfo> esRoomSearch(String indexName, String sourceType,
                                  String roomId,
                                  Integer pageSize,
                                  Integer pageNo);

    /**
     * 分页查询酒店信息
     *
     * @param indexName 索引名称
     * @param sourceType 资源类型
     * @param hotelId 酒店Id
     * @param pageSize 也大小
     * @param pageNo 当前页
     * @return
     */
    List<EsHotelInfo> esHotelSearch(String indexName, String sourceType, String hotelId, Integer pageSize, Integer pageNo);

    /**
     * 更新图片
     *
     * @param id 主键ID （【酒店/房间】前缀+id）
     * @param map 更新对象Map
     * @param indexName 索引名称
     * @return 更新图片
     */
    UpdateResponse updateHotelOrRoomImage(String id, Map<String, String> map, String indexName);


    /**
     * 删除过期的房态信息
     *
     * @param indexName 索引名称
     * @param indexIds   主键唯一ID集合
     * @return 返回删除结果
     */
    BulkResponse deleteOverTimeCalendar(String indexName, List<String> indexIds);

    /**
     * 根据parentId 查询子类
     * @param hotelSourceId 酒店ID
     * @param indexName 索引名称
     * @return 返回结果
     */
    List<EsRoomInfo> queryByParentId(String hotelSourceId, String indexName);

    /**
     * 根据parentId 查询子类
     *
     * @param roomSourceId 房间ID
     * @param indexName 索引名称
     * @return
     */
    List<EsRoomCalendarInfo> queryCalendarByParentId(String roomSourceId, String indexName);

    /**
     * 删除酒店的所有房态
     * @param hotelId
     * @param indexName
     *
     * @return BulkByScrollResponse
     */
    BulkByScrollResponse deleteCalendarByHotelId(String hotelId, String indexName);

    /**
     * 删除酒店的房间的所有房态
     * @param hotelId
     * @param indexName
     * @param roomId
     *
     * @return BulkByScrollResponse
     */
    BulkByScrollResponse deleteCalendarByHotelAndRoomId(String hotelId, String roomId, String indexName);

}
